axum_responses 0.3.1

A Simple way to use Axum responses
Documentation
<div align="center">
    <img src="./images/logo.png" width=250 />
</div>

<div align="center">
    <h1>Axum Responses</h1>
</div>

<div align="center">
  <a href="README.md" title="English README">馃嚭馃嚫 English</a>
  &nbsp;&nbsp;|&nbsp;&nbsp;
  <a href="README[ES].md" title="README en Espa帽ol">馃嚜馃嚫 Espa帽ol</a>
</div>

<div align="center">
    <strong>Una forma sencilla de manejar respuestas y resultados en Axum</strong>
</div>

---

## Descripci贸n

**Axum Responses** es una biblioteca dise帽ada para simplificar la creaci贸n y manejo de respuestas HTTP en aplicaciones construidas con [Axum](https://github.com/tokio-rs/axum). Proporciona una abstracci贸n clara para manejar respuestas est谩ndar y personalizadas, junto con herramientas 煤tiles como macros para reducir la repetici贸n de c贸digo.

---

## Instalaci贸n

Agrega la dependencia en tu archivo `Cargo.toml`:

```toml
[dependencies]
axum_responses = "0.3.1"
```

Aseg煤rate de incluir tambi茅n las dependencias necesarias como `axum`, `serde` y `serde_json`.

---

## Caracter铆sticas

- **Respuestas est谩ndar y personalizadas**: Maneja respuestas HTTP comunes como `200 OK`, `404 Not Found`.
- **Macros 煤tiles**: Usa el macro `response!` para simplificar la creaci贸n de respuestas con c贸digos de estado y cuerpos personalizados.
- **Integraci贸n con Axum**: Dise帽ado espec铆ficamente para trabajar con el framework Axum.
---

## Ejemplo de Uso

### Respuestas est谩ndar y personalizadas

La enum `Response` incluye variantes para los c贸digos de estado HTTP m谩s comunes, como `Response::OK`, `Response::NOT_FOUND`, y m谩s. Tambi茅n puedes crear respuestas personalizadas con `Response::CUSTOM`.

```rust
use axum::{Router, routing::get};
use axum_responses::standard::Response;
use serde_json::json;

async fn handler() -> Response {
    Response::OK
}

async fn custom_handler() -> Response {
    Response::CUSTOM(201, json!({ "message": "Creado exitosamente" }))
}

fn app() -> Router {
    Router::new()
        .route("/", get(handler))
        .route("/custom", get(custom_handler))
}
```

### Usando `HttpResponse` para respuestas m谩s flexibles

La estructura `HttpResponse` te permite construir respuestas con un c贸digo de estado, cuerpo JSON y cabeceras personalizadas utilizando un patr贸n builder.

```rust
use axum_responses::http::HttpResponse;
use axum::http::StatusCode;
use serde_json::json;
use serde::Serialize;

// Handler simple con HttpResponse
async fn http_response_handler() -> HttpResponse {
    HttpResponse::build()
        .status(StatusCode::OK)
        .add_header("X-Custom-Header", "valor_custom")
        .body(json!({ "message": "Hola desde HttpResponse" }))
}

// Handler usando el m茅todo `json()` para serializar structs
#[derive(Serialize)]
struct User {
    id: u32,
    username: String,
}

async fn http_response_json_struct_handler() -> HttpResponse {
    let user_data = User {
        id: 1,
        username: "usuario_ejemplo".to_string(),
    };
    HttpResponse::build()
        .status(StatusCode::OK)
        .json(user_data) // Serializa autom谩ticamente User a JSON
}

// Ejemplo en una aplicaci贸n Axum
use axum::{Router, routing::get};

fn app_with_http_response() -> Router {
    Router::new()
        .route("/http", get(http_response_handler))
        .route("/user", get(http_response_json_struct_handler))
}
```

### Macro `response!`

El macro `response!` permite crear respuestas `HttpResponse` con un c贸digo de estado y un cuerpo JSON de manera m谩s concisa. Tambi茅n soporta la auto-serializaci贸n de structs que implementan `Serialize`.

```rust
use axum_responses::{response, http::HttpResponse};
use serde::Serialize;

async fn example_handler() -> HttpResponse {
    response!(200, { "status": "success", "data": "Ejemplo" })
}

async fn error_handler() -> HttpResponse {
    response!(404, { "error": "Recurso no encontrado" })
}

#[derive(Serialize)]
struct Product {
    id: String,
    name: String,
    price: f64,
}

async fn product_handler() -> HttpResponse {
    let product_data = Product {
        id: "prod_123".to_string(),
        name: "Producto Ejemplo".to_string(),
        price: 99.99,
    };
    // La struct product_data se serializar谩 autom谩ticamente a JSON
    response!(201, { product_data })
}

async fn another_error_handler() -> HttpResponse {
    response!(500, { "error": "Error interno del servidor" })
}

// Ejemplo en una aplicaci贸n Axum
use axum::{Router, routing::get};

fn app_with_macro() -> Router {
    Router::new()
        .route("/macro-example", get(example_handler))
        .route("/macro-product", get(product_handler))
        .route("/macro-error", get(error_handler))
}

```

### Diferencias entre `Response` y `HttpResponse`

- **`Response`**: Es una enumeraci贸n dise帽ada para manejar respuestas est谩ndar y personalizadas de manera sencilla. Es 煤til para controladores que necesitan devolver respuestas predefinidas.

- **`HttpResponse`**: Es una estructura m谩s flexible que permite definir un c贸digo de estado y un cuerpo JSON arbitrarios. Es ideal para casos donde necesitas un control m谩s granular sobre la respuesta con un patr贸n de dise帽o builder.

Ambos tipos implementan el trait `IntoResponse`, lo que significa que pueden ser utilizados directamente como respuestas en Axum.

---